# -*- coding:utf-8 -*-
# @File       :   送包裹.py
# @Author     :   LINING
# @Time       :   2024/3/12 17:29
# @Description :
"""
https://leetcode-cn.com/problems/capacity-to-ship-packages-within-d-days/
传送带上的包裹必须在 days 天内从一个港口运送到另一个港口。

传送带上的第 i 个包裹的重量为 weights[i]。每一天，我们都会按给出重量（weights）的顺序往传送带上装载包裹。我们装载的重量不会超过船的最大运载重量。

返回能在 days 天内将传送带上的所有包裹送达的船的最低运载能力。



示例 1：

输入：weights = [1,2,3,4,5,6,7,8,9,10], days = 5
输出：15
解释：
船舶最低载重 15 就能够在 5 天内送达所有包裹，如下所示：
第 1 天：1, 2, 3, 4, 5
第 2 天：6, 7
第 3 天：8
第 4 天：9
第 5 天：10

请注意，货物必须按照给定的顺序装运，因此使用载重能力为 14 的船舶并将包装分成 (2, 3, 4, 5), (1, 6, 7), (8), (9), (10) 是不允许的。
"""
# 载货量为x时需要几艘船
# weights = [3,2,2,4,1,4]
# days = 3
# weights = [1,2,3,1,1]
# days = 4
weights = [1,2,3,4,5,6,7,8,9,10]
days = 5


def get_day(weight_list, weight):
    """
    当前载重需要几艘船
    weight_list:货物列表
    weight: 每艘船载重
    :return:  需要的天数
    """
    # 需要天数
    day = 0
    # 已有载重
    current_weight = 0
    for i in weight_list:
        if current_weight+i <= weight:
            current_weight = current_weight+i
        else:
            current_weight = i
            day = day+1
    if current_weight > 0:
        day = day+1
    return day


def get_min(weight_list, day):
    left = max(weight_list)
    right = sum(weight_list)
    while left < right:
        mid = int((left+right)/2)
        if get_day(weight_list, mid) <= day:
            right = mid
        else:
            left = mid+1
    return right


print(get_min(weights, days))

